﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace h2100
{
    public class hParams
    {
        public Random random = new Random();

        private hActionManager _actionManager;
        /// <summary>
        /// Quản lý các action (button) trong game (thường thì nằm trên control panel)
        /// </summary>
        public hActionManager ActionManager
        {
            get { return _actionManager; }
            set { _actionManager = value; }
        }

        //private int _selStructureIndex;
        ///// <summary>
        ///// Chỉ số của công trình đang được chọn
        ///// </summary>
        //public int SelectedStructureIndex
        //{
        //    get { return _selStructureIndex; }
        //    set 
        //    {
        //        if (_selStructureIndex == value)
        //        {
        //            _selStructureIndexHasChanged = false;
        //        }
        //        else
        //        {
        //            _selStructureIndex = value;
        //            _selStructureIndexHasChanged = true;
        //        }
        //    }
        //}

        private bool _selStructureIndexHasChanged;
        /// <summary>
        /// Xác định sự kiện một công trình khác được chọn
        /// </summary>
        public bool SelectedStructureIndexHasChanged
        {
            get { return _selStructureIndexHasChanged; }
            set { _selStructureIndexHasChanged = value; }
        }

        private hStructure _selStructure;
        /// <summary>
        /// Công trình đang được chọn
        /// </summary>        
        public hStructure SelectedStructure
        {
            get { return _selStructure; }
            set
            {
                if (_selStructure == value)
                {
                    _selStructureHasChanged = false;
                }
                else
                {
                    _selStructure = value;
                    _selStructureHasChanged = true;
                }
            }
        }

        private hUnit _selUnit;
        public hUnit SelectedUnit
        {
            get { return _selUnit; }
            set
            {
                if (_selUnit == value)
                {
                    _selUnitHasChanged = false;
                }
                else
                {
                    _selUnit = value;
                    _selUnitHasChanged = true;
                }
            }
        }

        private bool _selStructureHasChanged;
        /// <summary>
        /// Xác định sự kiện một công trình khác được chọn
        /// </summary>        
        public bool SelectedStructureHasChanged
        {
            get { return _selStructureHasChanged; }
            set { _selStructureHasChanged = value; }
        }

        private bool _selUnitHasChanged;
        /// <summary>
        /// Xác định sự kiện một đơn vị khác được chọn
        /// </summary>        
        public bool SelectedUnitHasChanged
        {
            get { return _selUnitHasChanged; }
            set { _selUnitHasChanged = value; }
        }


        private Point _selMapCellIndexRowColumn;
        /// <summary>
        /// Chỉ số ô bản đồ đang được chọn
        /// </summary>        
        public Point SelectedMapCellIndexRowColumn
        {
            get { return _selMapCellIndexRowColumn; }
            set { _selMapCellIndexRowColumn = value; }
        }

        private hMapCell _selMapCell;
        /// <summary>
        /// Ô bản đồ đang được chọn
        /// </summary>        
        public hMapCell SelectedMapCell
        {
            get { return _selMapCell; }
            set { _selMapCell = value; }
        }

        private Vector2 _selMapCellPos;
        /// <summary>
        /// Vị trí ô bản đồ đang được chọn
        /// </summary>        
        public Vector2 SelectedMapCellPosition
        {
            get { return _selMapCellPos; }
            set { _selMapCellPos = value; }
        }

        private hGlobal.GameState _gameState;
        /// <summary>
        /// Trạng thái game: đang chơi, đang tạm dừng...
        /// </summary>        
        public hGlobal.GameState GameState
        {
            get { return _gameState; }
            set 
            {
                _preGameState = _gameState;
                _gameState = value; 
            }
        }

        private hGlobal.GameState _preGameState;
        /// <summary>
        /// Trạng thái game trước đó
        /// </summary>        
        public hGlobal.GameState PrevGameState
        {
            get { return _preGameState; }
        }

        private hGlobal.Turn _gameTurn;
        /// <summary>
        /// Lượt đi thuộc về (người/máy)
        /// </summary>        
        public hGlobal.Turn GameTurn
        {
            get { return _gameTurn; }
            set { _gameTurn = value; }
        }

        private hGlobal.ControlPhase _controlPhase;
        /// <summary>
        /// Trạng thái điều khiển của bảng điều khiển
        /// </summary>        
        public hGlobal.ControlPhase ControlPhase
        {
            get { return _controlPhase; }
            set 
            {
                _precontrolPhase = _controlPhase;
                _controlPhase = value;                
                if (_controlPhase == hGlobal.ControlPhase.Selecting)
                {
                    SelectedMapCell = null;
                    SelectedMapCellPosition = new Vector2(-100000, -100000);
                }
            }
        }

        private hGlobal.ControlPhase _precontrolPhase = hGlobal.ControlPhase.NoAction;
        /// <summary>
        /// Trạng thái điều khiển trước đó của bảng điều khiển
        /// </summary>        
        public hGlobal.ControlPhase PrevControlPhase
        {
            get { return _precontrolPhase; }
            set { _precontrolPhase = value;  }
        }

        //private hGlobal.Action _selAction;
        ///// <summary>
        ///// Action đang được chọn
        ///// </summary>        
        //public hGlobal.Action SelectingAction
        //{
        //    get { return _selAction; }
        //    set { _selAction = value; }
        //}

        private hStructureManager _structMan;
        /// <summary>
        /// Đơn vị quản lý công trình
        /// </summary>        
        public hStructureManager StructureManager
        {
            get { return _structMan; }
            set { _structMan = value; }
        }

        private hMapManager _mapMan;
        /// <summary>
        /// Đơn vị quản lý bản đồ
        /// </summary>
        public hMapManager MapManager
        {
            get { return _mapMan; }
            set { _mapMan = value; }
        }

        private hControlPanel _ctrlPanel;
        /// <summary>
        /// Bảng điều khiển
        /// </summary>
        public hControlPanel ControlPanel
        {
            get { return _ctrlPanel; }
            set { _ctrlPanel = value; }
        }

        private Game _game;
        /// <summary>
        /// Game đang chơi
        /// </summary>
        public Game hGame
        {
            get { return _game; }
            set { _game = value; }
        }

        private int _energy;
        /// <summary>
        /// Tổng năng lượng hiện có
        /// </summary>
        public int Energy
        {
            get { return _energy; }
            set { _energy = value; }
        }

        private int _eProduction;
        /// <summary>
        /// Lượng năng lượng sản xuất ở lượt đi kế
        /// </summary>
        public int EnergyProduction
        {
            get { return _eProduction; }
            set { _eProduction = value; }
        }

        private hGrid _grid;
        /// <summary>
        /// Lưới canh vật thể
        /// </summary>
        public hGrid Grid
        {
            get { return _grid; }
            set { _grid = value; }
        }

        private hMapCell _highlightingMapCell;
        /// <summary>
        /// Ô bản đồ đang có con trỏ chuột ở trên
        /// </summary>
        public hMapCell HightlightingMapCell
        {
            get { return _highlightingMapCell; }
            set { _highlightingMapCell = value; }
        }

        /// <summary>
        /// Cập nhật tình hình sản xuất và tiêu thụ năng lượng
        /// </summary>
        public void updateEnergy()
        {
            EnergyProduction = MapManager.getEnergy();
            Energy += EnergyProduction;
        }

        private bool _startofTurn=true;
        /// <summary>
        /// Bắt đầu của một lượt đi
        /// </summary>
        public bool StartOfTurn
        {
            get { return _startofTurn; }
            set { _startofTurn = value; }
        }
                
        /// <summary>
        /// Con trỏ chuột có nằm trên ControlPanel không?
        /// </summary>
        public bool IsMouseOverControlPanel
        {
            get 
            {
                MouseState mouse = Mouse.GetState();
                if (mouse.X > _ctrlPanel.X && mouse.X < _ctrlPanel.X + _ctrlPanel.Width
                    && mouse.Y > _ctrlPanel.Y && mouse.Y < _ctrlPanel.Y + _ctrlPanel.Height)
                {
                    return true;
                }
                return false; 
            }
        }

        /// <summary>
        /// Con trỏ chuột có nằm trên map không
        /// </summary>
        public bool IsMouseOverMap
        {
            get 
            {
                MouseState mouse = Mouse.GetState();
                if (mouse.X > 0 && mouse.X < hGlobal.ViewWidth
                    && mouse.Y > 0 && mouse.Y < hGlobal.ViewHeight)
                {
                    return true;
                }
                return false; 
            }
        }

        private Texture2D _subCursor;
        /// <summary>
        /// Con trỏ phụ nằm dưới contrỏ chính
        /// </summary>
        public Texture2D SubCursor
        {
            get { return _subCursor; }
            set 
            {
                _subCursor = value;
                _subCursorColor = Color.White;
            }
        }

        private Color _subCursorColor;
        /// <summary>
        /// Màu con trỏ phụ
        /// </summary>
        public Color SubCursorColor
        {
            get { return _subCursorColor; }
            set { _subCursorColor = value; }
        }

        //private bool _needClearDevice = true;
        //public bool NeedClearDevice
        //{
        //    get { return _needClearDevice; }
        //    set { _needClearDevice = value; }
        //}

        private hSkill _skill;
        public hSkill Skill
        {
            get { return _skill; }
            set { _skill = value; }
        }

        private hCommonTexture _commonTexture;
        /// <summary>
        /// Chứa các texture dùng chung
        /// </summary>
        public hCommonTexture CommonTexture
        {
            get { return _commonTexture; }
            set { _commonTexture = value; }
        }

        private hUnitManager _unitManager;
        public hUnitManager UnitManager
        {
            get { return _unitManager; }
            set { _unitManager = value; }
        }

        public hParams()
        {
            _controlPhase = hGlobal.ControlPhase.NoAction;
            _gameState = hGlobal.GameState.Undefined;
            _gameTurn = hGlobal.Turn.Player;
            _selStructure = null;
            _selStructureHasChanged = false;
            //_selStructureIndex = -1;
            _selStructureIndexHasChanged = false;
            _selMapCellPos = new Vector2(-100000, -100000);
            _highlightingMapCell = null;
            _structMan = null;
            _ctrlPanel = null;
            _mapMan = null;
            _game = null;
            _energy = 0;
            _eProduction = 0;
        }
    }
}
